package com.tx.java.chapter14.exercise14_7;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *  动态代理生成 eason的代理对象
 *
 *      规定： 要生成一个对象的代理对象，那么该对象必须要有一个接口
 */
public class EasonProxy {

    Person eason = new Eason();

    /**
     * static Object newProxyInstance(ClassLoader loader,     使用哪个类加载器
     *  Class<?>[] interfaces, InvocationHandler h) static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 生成哪个对象的代理类
     *  InvocationHandler h)   这个代理对象要做什么事情
     */
    /**
     * 获得eason的代理对象
     * Person person = easonProxy.getEasonProxy();
     * 此处：person就是代理对象
     * @return
     */
    public Person getEasonProxy(){
        return (Person) Proxy.newProxyInstance(this.getClass().getClassLoader(),
                eason.getClass().getInterfaces(), new InvocationHandler() {
                    /**
                     * 代理对象要做的事
                     * @param proxy 代理对象  person
                     * @param method 代理对象调用的方法  sing或者dance
                     * @param args 方法的参数
                     * @return
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        String name =  method.getName();
                        if("sing".equals(name)){
                            System.out.println("eason唱歌需要10w！");
                            method.invoke(eason);
                        }
                        if("dance".equals(name)){
                            System.out.println("eason跳舞需要20w！");
                            method.invoke(eason);
                        }
                        return true;
                    }
                });
    }
}